from flask import Flask, jsonify, render_template
import random
import datetime
from flask_cors import CORS  # 导入 CORS 类

app = Flask(__name__)
CORS(app)  # 启用 CORS，允许所有源访问


# 主页路由
@app.route('/')
def index():
    return render_template('index.html')


# 生成随机数据的辅助函数
def generate_random_data(length, min_val=0, max_val=100):
    return [random.randint(min_val, max_val) for _ in range(length)]


def generate_random_dates(length):
    today = datetime.datetime.now()
    dates = []
    for i in range(length):
        date = today - datetime.timedelta(days=i)
        dates.append(date.strftime('%Y-%m-%d'))
    return dates[::-1]


# API路由 - 折线图数据
@app.route('/api/line')
def line_data():
    labels = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
    datasets = [
        {
            'label': '产品A',
            'data': generate_random_data(12, 20, 100),
            'borderColor': '#165DFF',
            'backgroundColor': 'rgba(22, 93, 255, 0.1)',
            'tension': 0.4,
            'fill': False
        },
        {
            'label': '产品B',
            'data': generate_random_data(12, 10, 90),
            'borderColor': '#36CBCB',
            'backgroundColor': 'rgba(54, 203, 203, 0.1)',
            'tension': 0.4,
            'fill': False
        }
    ]
    return jsonify({'labels': labels, 'datasets': datasets})


# API路由 - 柱状图数据
@app.route('/api/bar')
def bar_data():
    labels = ['Q1', 'Q2', 'Q3', 'Q4']
    datasets = [
        {
            'label': '产品A',
            'data': generate_random_data(4, 30, 100),
            'backgroundColor': '#165DFF'
        },
        {
            'label': '产品B',
            'data': generate_random_data(4, 20, 80),
            'backgroundColor': '#36CBCB'
        },
        {
            'label': '产品C',
            'data': generate_random_data(4, 10, 90),
            'backgroundColor': '#52C41A'
        }
    ]
    return jsonify({'labels': labels, 'datasets': datasets})


# API路由 - 饼图数据
@app.route('/api/pie')
def pie_data():
    labels = ['北美', '欧洲', '亚洲', '南美', '非洲', '大洋洲']
    values = generate_random_data(len(labels), 5, 35)
    total = sum(values)
    # 确保总和为100
    normalized_values = [round((v / total) * 100) for v in values]
    # 调整可能的舍入误差
    diff = 100 - sum(normalized_values)
    if diff != 0:
        normalized_values[normalized_values.index(max(normalized_values))] += diff

    colors = [
        '#165DFF',
        '#36CBCB',
        '#52C41A',
        '#FAAD14',
        '#FF4D4F',
        '#1890FF'
    ]

    return jsonify({
        'labels': labels,
        'datasets': [
            {
                'data': normalized_values,
                'backgroundColor': colors,
                'borderWidth': 1
            }
        ]
    })


# API路由 - 雷达图数据
@app.route('/api/radar')
def radar_data():
    labels = ['设计', '性能', '易用性', '功能', '价格', '支持']
    datasets = [
        {
            'label': '产品X',
            'data': generate_random_data(len(labels), 60, 100),
            'backgroundColor': 'rgba(22, 93, 255, 0.2)',
            'borderColor': '#165DFF',
            'pointBackgroundColor': '#165DFF',
            'pointBorderColor': '#fff',
            'pointHoverBackgroundColor': '#fff',
            'pointHoverBorderColor': '#165DFF'
        },
        {
            'label': '产品Y',
            'data': generate_random_data(len(labels), 50, 90),
            'backgroundColor': 'rgba(54, 203, 203, 0.2)',
            'borderColor': '#36CBCB',
            'pointBackgroundColor': '#36CBCB',
            'pointBorderColor': '#fff',
            'pointHoverBackgroundColor': '#fff',
            'pointHoverBorderColor': '#36CBCB'
        }
    ]
    return jsonify({'labels': labels, 'datasets': datasets})


# API路由 - 极坐标图数据
@app.route('/api/polar')
def polar_data():
    labels = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
    datasets = [
        {
            'data': generate_random_data(len(labels), 5, 20),
            'backgroundColor': [
                'rgba(22, 93, 255, 0.7)',
                'rgba(54, 203, 203, 0.7)',
                'rgba(82, 196, 26, 0.7)',
                'rgba(250, 173, 20, 0.7)',
                'rgba(255, 77, 79, 0.7)',
                'rgba(24, 144, 255, 0.7)',
                'rgba(153, 102, 255, 0.7)'
            ],
            'borderColor': '#fff',
            'borderWidth': 2
        }
    ]
    return jsonify({'labels': labels, 'datasets': datasets})


# API路由 - 气泡图数据
@app.route('/api/bubble')
def bubble_data():
    def generate_bubble_points(count):
        return [
            {
                'x': random.randint(10, 100),
                'y': random.randint(10, 100),
                'r': random.randint(5, 20)
            } for _ in range(count)
        ]

    datasets = [
        {
            'label': '产品A',
            'data': generate_bubble_points(8),
            'backgroundColor': 'rgba(22, 93, 255, 0.5)'
        },
        {
            'label': '产品B',
            'data': generate_bubble_points(8),
            'backgroundColor': 'rgba(54, 203, 203, 0.5)'
        }
    ]
    return jsonify({'datasets': datasets})


# API路由 - 散点图数据
@app.route('/api/scatter')
def scatter_data():
    def generate_scatter_points(count):
        return [
            {
                'x': random.randint(10, 100),
                'y': random.randint(10, 100)
            } for _ in range(count)
        ]

    datasets = [
        {
            'label': '数据点',
            'data': generate_scatter_points(20),
            'backgroundColor': '#165DFF'
        }
    ]
    return jsonify({'datasets': datasets})


# API路由 - 复合图数据
@app.route('/api/mixed')
def mixed_data():
    labels = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
    datasets = [
        {
            'label': '销售额',
            'type': 'bar',
            'data': generate_random_data(12, 20, 100),
            'backgroundColor': 'rgba(22, 93, 255, 0.7)'
        },
        {
            'label': '增长率',
            'type': 'line',
            'data': generate_random_data(12, 10, 50),
            'borderColor': '#FAAD14',
            'tension': 0.4
        }
    ]
    return jsonify({'labels': labels, 'datasets': datasets})


# API路由 - 面积图数据
@app.route('/api/area')
def area_data():
    labels = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
    # 生成递增的数据来模拟用户增长
    base = random.randint(100, 300)
    growth_rate = random.uniform(1.05, 1.2)
    data = [base]
    for i in range(1, len(labels)):
        data.append(int(data[i - 1] * growth_rate + random.randint(-50, 100)))

    datasets = [
        {
            'label': '用户数',
            'data': data,
            'borderColor': '#165DFF',
            'backgroundColor': 'rgba(22, 93, 255, 0.2)',
            'tension': 0.4,
            'fill': True
        }
    ]
    return jsonify({'labels': labels, 'datasets': datasets})


if __name__ == '__main__':
    app.run(debug=True)